# 指定文件编码为UTF-8
# coding: utf-8

"""
half_float_network.py 功能说明：
1. 测试深度卷积神经网络在float16和float64精度下的性能差异
2. 使用预训练的DeepConvNet模型进行MNIST分类任务
3. 比较两种浮点精度下的分类准确率
4. 通过减少测试样本数量实现快速验证

关键点：
- 展示浮点精度对深度学习模型的影响
- 验证float16精度在实际应用中的可行性
- 使用预训练模型参数进行测试
- 支持MNIST数据集测试
- 可调整采样数量平衡速度和准确性
"""

# 导入系统模块
import sys, os
# 添加父目录到系统路径
sys.path.append(os.pardir)
# 导入NumPy数值计算库
import numpy as np
# 导入matplotlib绘图库
import matplotlib.pyplot as plt
# 从deep_convnet导入深度卷积网络类
from deep_convnet import DeepConvNet
# 从dataset.mnist导入MNIST数据加载函数
from dataset.mnist import load_mnist

# 加载MNIST数据集(保持原始图像结构)
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=False)

# 初始化深度卷积网络
network = DeepConvNet()
# 加载预训练参数
network.load_params("deep_convnet_params.pkl")

# 采样10000个测试样本(提高测试速度)
sampled = 10000
x_test = x_test[:sampled]
t_test = t_test[:sampled]

# 测试float64精度下的准确率
print("caluculate accuracy (float64) ... ")
print(network.accuracy(x_test, t_test))

# 将测试数据和网络参数转换为float16精度
x_test = x_test.astype(np.float16)  # 转换输入数据
for param in network.params.values():
    param[...] = param.astype(np.float16)  # 转换网络参数

# 测试float16精度下的准确率
print("caluculate accuracy (float16) ... ")
print(network.accuracy(x_test, t_test))

"""
预期结果分析：
1. float64精度：
   - 使用双精度浮点数计算
   - 准确率较高(通常>99%)
   - 计算速度较慢

2. float16精度：
   - 使用半精度浮点数计算
   - 准确率可能略有下降
   - 计算速度更快，内存占用更少

注意事项：
1. 需要预先训练好的deep_convnet_params.pkl参数文件
2. 采样数量可根据硬件性能调整
3. float16可能在某些硬件上获得加速支持
4. 可以扩展测试其他浮点精度(float32等)
5. 实际应用中需权衡精度和性能
"""
